package javaTrader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import Observer.Observateur;

//classe charger de recuperer les valeurs des cours sur trueFX
public class Forex implements Runnable{
	
	private Historique historique;
	private boolean continuer;
	private Devise eurUsd;
	private URL trueFX;
	private ArrayList<Observateur> obs;
	
	//on recupere l'historique et on charge l'url
	public Forex(Historique historique)
	{
		this.historique = historique;
		eurUsd = new Devise();
		continuer = true;
		obs = new ArrayList<Observateur>();
		try {
			trueFX = new URL("http://webrates.truefx.com/rates/connect.html?c=EUR/USD");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		
	}
	
	//met a jour l'historique d'une devise
	public void update()
	{
		try {
			//on recupere le flux
			BufferedReader in = new BufferedReader(new InputStreamReader(trueFX.openStream()));
			String message;
			
			message = in.readLine();
			
			//on attribue les valeurs recuperer 
			eurUsd.setPaire(message.substring(0, 7));
			eurUsd.setDemande(message.substring(7, 14));
			eurUsd.setOffre(message.substring(14, 21));
			eurUsd.setMeilleureDemande(message.substring(21, 28));
			eurUsd.setMeilleureOffre(message.substring(28, 35));
			eurUsd.setTime(message.substring(35, 48));
			in.close();
			
			
		} catch (IOException e) {
			System.out.println("Impossible de se connecter");
			e.printStackTrace();
		}
		
		//on ajoute la nouvelle devise a l'historique
		historique.ajouter(eurUsd);
		
		if (!(obs.isEmpty()))
		{
			for(Observateur observateur : obs)
			{
				observateur.update();
			}
		}
		
	}
	
	//lance la procedure de mise a jour
	public void run()
	{
		while(continuer)
		{
			update();
			
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	//permet d'arreter le thread
	public synchronized void arreter()
	{
		continuer = false;
	}
	
	//ajoute un observateur pour la courbe
	public void ajouterObservateur(Observateur observateur)
	{
		this.obs.add(observateur);
	}
	
}
